package esercitazione5.JUnitTest;

import java.util.ArrayList;

import org.junit.*;

import esercitazione5.graphs.Edge;
import esercitazione5.graphs.Graph;
import esercitazione5.graphs.GraphInterface;
import esercitazione5.graphs.MST;
import esercitazione5.graphs.Vertex;
import static org.junit.Assert.*;

public class MSTTest {
	
	GraphInterface<Integer, Integer> g;
	Edge<Integer> edge,edge1;
	MST<Integer, Integer> mst;
	
	@Before
	public void setUp(){
		g = new Graph<Integer, Integer>();
		Vertex<Integer> uno = g.insertVertex(1);
		Vertex<Integer> due = g.insertVertex(2);
		Vertex<Integer> tre = g.insertVertex(3);
		Vertex<Integer> quattro = g.insertVertex(4);
		Vertex<Integer> cinque = g.insertVertex(5);
		Vertex<Integer> sei = g.insertVertex(6);
		Vertex<Integer> sette = g.insertVertex(7);
		Vertex<Integer> otto = g.insertVertex(8);
		Vertex<Integer> nove = g.insertVertex(9);
		Vertex<Integer> dieci = g.insertVertex(10);
		Vertex<Integer> undici = g.insertVertex(11);

		edge = g.insertEdge(due, tre, 3);
		g.insertEdge(due, cinque, 10);
		g.insertEdge(quattro, cinque, 4);
		g.insertEdge(quattro, dieci, 1);
		g.insertEdge(cinque, sette, 4);
		g.insertEdge(sette, uno, 3);
		g.insertEdge(sette, nove, 6);
		g.insertEdge(uno, undici, 13);
		g.insertEdge(sei, otto, 2);
		g.insertEdge(dieci, sette, 11);
		g.insertEdge(sei, cinque, 4);
		g.insertEdge(cinque, cinque,1);
		edge1 = g.insertEdge(sei, sette, 34);
		g.insertEdge(dieci, quattro, 1);
		mst = new MST<Integer, Integer>(g);
	}
	
	@Test
	public void testKruscal(){
		ArrayList<Edge<Integer>> l = (ArrayList<Edge<Integer>>) mst.kruskal();
		for(Edge<Integer> e : l){
			assertEquals(edge.getSource().getProperty("idGroup"), e.getSource().getProperty("idGroup"));
			assertEquals(edge.getDestination().getProperty("idGroup"), e.getDestination().getProperty("idGroup"));
			assertNotEquals(edge1, e);
		}
		
		assertEquals(1, l.get(0).getProperty("weight"));
		assertEquals(13, l.get(l.size()-1).getProperty("weight"));
	}
}
